#pragma once 

/*-------------------------------------------头文件-------------------------------------------*/
#include <iostream>   
#include <vector>     
#include <ctime>      // 提供“时间相关函数” ---> 如time()用于初始化随机数种子

// 定义函数指针类型task_t，指向"无参数、无返回值"的任务函数
typedef void (*task_t)();

/*-------------------------------------------任务函数-------------------------------------------*/
//1.打印日志任务：示例任务函数，符合task_t类型
void PrintLog()
{
    std::cout << "我是一个打印日志的任务" << std::endl;
}

//2.下载任务：示例任务函数，符合task_t类型
void Download()
{
    std::cout << "我是一个下载的任务" << std::endl;
}

//3.上传任务：示例任务函数，符合task_t类型
void Upload()
{
    std::cout << "我是一个上传的任务" << std::endl;
}


/*-------------------------------------------任务管理器类-------------------------------------------*/
// 任务管理器类：负责注册任务函数、生成任务码、执行任务
class TaskManager
{ 
private:
    //1.存储所有注册的任务函数（函数指针容器）
    std::vector<task_t> _tasks;  

public:
    //1.“构造函数” ---> 初始化随机数种子用于后续随机生成任务码
    TaskManager()
    {
        srand(time(nullptr));  
    }

    //2.“析构函数” ---> 无动态资源需要释放，默认即可
    ~TaskManager()
    {}  

    //3.“注册任务函数” ---> 将任务函数添加到任务列表中
    void Register(task_t t) //参数t：符合task_t类型的函数指针（即任务函数）
    {
        _tasks.push_back(t);  
    }

    //4.“生成任务码” ---> 随机返回一个有效任务索引用于指定执行哪个任务
    int Code()
    {
        return rand() % _tasks.size(); //返回值：0到任务数量-1之间的随机整数作为任务的标识
    }

    //5.“执行任务” ---> 根据任务码调用对应的任务函数
    void Execute(int code)
    {
        //1.检查任务码是否有效（0 <= code < 任务数量）
        if(code >= 0 && code < _tasks.size())
        {
            _tasks[code]();  // 通过任务码索引调用对应的任务函数
        }
    }
};

